package db

import (
	"ci-control-backend/model"
	"xorm.io/xorm"
)

// Pageable 分页查询器
type Pageable[R any] struct {
	SQL       *xorm.Session //SQL会话
	modelType any           //model类型
	offset    int           //偏移
	limit     int           //页大小
}

// PageResult 分页结果
type PageResult[T any] struct {
	TotalRecords int64 `json:"total_records"` // 满足条件的记录总数
	PageData     []T   `json:"page_data"`     // 分页数据
	DataLength   int64 `json:"data_length"`   // 分页数据的长度
}

// QueryPage 创建分页查询器
// rType 返回类型
func QueryPage[R any](rType R) (pageable *Pageable[R]) {
	return &Pageable[R]{
		SQL:       model.DB.Table(rType),
		modelType: rType,
	}
}

// QueryPageByTable 创建复杂分页查询器，返回类型与数据表不一致
// rType 返回类型
// tType 数据表
func QueryPageByTable[R any, T any](_ R, tType T) (pageable *Pageable[R]) {
	return &Pageable[R]{
		SQL:       model.DB.Table(tType),
		modelType: tType,
	}
}

// PageParam 设置分页参数：页号、页大小
// page 页号
// pageSize 页大小
func (p *Pageable[R]) PageParam(page int, pageSize int) *Pageable[R] {
	p.offset = (page - 1) * pageSize
	p.limit = pageSize
	return p
}

// Exec 执行分页查询
func (p *Pageable[R]) Exec() (*PageResult[R], error) {
	// 查询满足条件的总记录数
	totalRecords, err := model.DB.Count(p.modelType)
	if err != nil {
		return nil, err
	}

	// 进行分页查询
	var dst []R // 存放数据
	err = p.SQL.Limit(p.limit, p.offset).Find(&dst)
	if err != nil {
		return nil, err
	}

	// 返回查询结果
	return &PageResult[R]{
		TotalRecords: totalRecords,
		PageData:     dst,
		DataLength:   int64(len(dst)),
	}, nil
}

//func (p *Pageable[R]) Where(query interface{}, args ...interface{}) *Pageable[R] {
//	p.SQL = p.SQL.Where(query, args...)
//	return p
//}
//
//func (p *Pageable[R]) Cols(columns ...string) *Pageable[R] {
//	p.SQL = p.SQL.Cols(columns...)
//	return p
//}
